package main

import (
	"github.com/gin-gonic/gin"
	"github.com/go-playground/validator/v10"
	"net/http"
	"reflect"
)

type User struct {
	Name string `json:"name" binding:"required" msg:"用户名不能为空"`
	Age  int    `json:"age" binding:"required" msg:"年龄不能为空"`
}

// main函数是程序的入口点
func main() {
	// 初始化默认的gin路由器
	router := gin.Default()

	// 处理POST请求，路径为"/"
	router.POST("/", func(c *gin.Context) {
		// 定义一个User结构体变量，用于存储解析后的请求体数据
		var user User

		// 尝试将请求体数据绑定到user结构体
		err := c.ShouldBind(&user)
		// 如果绑定发生错误
		if err != nil {
			// 获取user结构体的反射类型，用于后续的字段检查
			getObj := reflect.TypeOf(&user)

			// 尝试将错误转换为validator.ValidationErrors类型
			if errors, ok := err.(validator.ValidationErrors); ok {
				// 遍历所有的验证错误
				for _, e := range errors {
					// 检查user结构体中是否存在名为e.Field()的字段
					if field, exits := getObj.Elem().FieldByName(e.Field()); exits {
						// 如果字段存在，返回该字段的msg标签内容作为响应
						c.JSON(http.StatusOK, gin.H{"code": 400, "msg": field.Tag.Get("msg")})
						return
					}
				}
			}
			// 返回绑定错误信息作为响应
			c.JSON(http.StatusOK, gin.H{"code": 400, "msg": err.Error()})
			return
		}
		// 如果没有错误，返回成功的响应，包含用户数据
		c.JSON(http.StatusOK, gin.H{"code": 200, "data": user, "msg": "ok"})
	})

	// 启动gin服务器，监听8080端口
	router.Run(":8080")
}
